import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('餐饮连锁品牌数据_销售记录3_cleaned.xlsx')

# 提取小时和时段
df['销售时间(时)'] = df['销售时间(时)'].astype(int)

# 计算客流量：每个时段的订单数
traffic = df.groupby('销售时间(时)').size().reset_index(name='客流量')

# 计算核心菜品销量：选择销量最高的菜品
top_dish = df.groupby('菜品ID')['销售数量'].sum().idxmax()
core_dish_sales = df[df['菜品ID'] == top_dish].groupby('销售时间(时)')['销售数量'].sum().reset_index(name='核心菜品销量')

# 创建完整的时间范围（6-17小时）
full_hours = pd.DataFrame({'销售时间(时)': range(6, 18)})

# 合并数据，确保6-17小时都有数据，缺失的填充为0
traffic_full = pd.merge(full_hours, traffic, on='销售时间(时)', how='left').fillna(0)
core_dish_sales_full = pd.merge(full_hours, core_dish_sales, on='销售时间(时)', how='left').fillna(0)

# 合并完整数据
merged_data = pd.merge(traffic_full, core_dish_sales_full, on='销售时间(时)')

# 绘制折线图
plt.figure(figsize=(12, 6))
line1 = plt.plot(merged_data['销售时间(时)'], merged_data['客流量'], marker='o', label='客流量（人）', linewidth=2, color='blue')
line2 = plt.plot(merged_data['销售时间(时)'], merged_data['核心菜品销量'], marker='s', label='核心菜品销量（份）', linewidth=2, color='orange')

# 为客流量数据点添加数字标注
for x, y in zip(merged_data['销售时间(时)'], merged_data['客流量']):
    plt.text(x, y + max(merged_data['客流量']) * 0.02, f'{int(y)}',
             ha='center', va='bottom', fontsize=9, color='blue', fontweight='bold')

# 为核心菜品销量数据点添加数字标注
for x, y in zip(merged_data['销售时间(时)'], merged_data['核心菜品销量']):
    plt.text(x, y + max(merged_data['核心菜品销量']) * 0.02, f'{int(y)}',
             ha='center', va='bottom', fontsize=9, color='orange', fontweight='bold')

# 图表美化
plt.title('各时段客流量与核心菜品销量趋势', fontsize=16, fontweight='bold')
plt.xlabel('时段（小时）', fontsize=12)
plt.ylabel('数量', fontsize=12)
plt.legend()
plt.grid(True, linestyle='--', alpha=0.7)
plt.xticks(range(6, 18))
plt.xlim(5.5, 17.5)
plt.tight_layout()

# 显示图表
plt.show()
